﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace Medianamik.Core.Urls
{
    public class PathSegmentFormater : IPathSegmentFormater 
    {
        public string Format(PathSegment pSegment)
        {
            return Format(pSegment.Value);
        }

        public string Format(string pSegment)
        {
            string pOut = pSegment.ToLowerInvariant();
            pOut = pOut.Trim();
            pOut = RemoveDiacritics(pOut);
            pOut = RemoveUnallowedCharacters(pOut);
            return pOut;
        }

        static string RemoveUnallowedCharacters(string pIn)
        {
            //Conserver seulement A-Z a-z 0-9 et '-' et les espaces
            var result = Regex.Replace(pIn, "[^-a-zA-Z0-9\\s]", "");
            //remplacer les espaces par des '-'
            result = Regex.Replace(result, "[\\s]", "-");
            //Remplacer plusieurs '-' consécutifs par un seul
            result = Regex.Replace(result, "-+", "-");
            //Supprimer un éventuel '-' devant la chaine
            result = result.TrimStart('-').TrimEnd('-');

            result = result.Trim();
            return result;
        }

        static string RemoveDiacritics(string stIn)
        {
            // Supprime les accents sur les caractères.
            // Attention ! Fonctionne avec l'alphabet latin mais pas forcement
            // avec d'autres alphabets
            // http://blogs.msdn.com/michkap/archive/2007/05/14/2629747.aspx
            string stFormD = stIn.Normalize(NormalizationForm.FormD);
            StringBuilder sb = new StringBuilder();

            for (int ich = 0; ich < stFormD.Length; ich++)
            {
                UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
                if (uc != UnicodeCategory.NonSpacingMark)
                {
                    sb.Append(stFormD[ich]);
                }
            }

            return (sb.ToString().Normalize(NormalizationForm.FormC));
        }
    }
}
